04.4 精通自定义 View 之属性动画进阶——NineOldAndroids

返回自定义 View 目录

Android 3.0 推出了全新的 Animation API,使用起来很方便,但是不能在 3.0 以下版本中使用。NineOldAndroids 是一个可以在任意 Android 版本上使用的 Animation API。

常用类有 ObjectAnimator、ValueAnimator、AnimatorSet、PropertyValuesHolder、Keyframe、ViewPropertyAnimator、ViewHelper.

4.4.1 NineOldAndroids 中的 ViewPropertyAnimator

1
2
3
4
5
// 官方 API(3.1 以上)
mView.animate().setDuration(5000).rotationY(720).x(100).y(100).start();
// NineOldAndroids
ViewPropertyAnimator.animate(mView).setDuration(5000).rotationY(720).x(100).y(100).start();

从对比中可以看出,唯一不同的是 animate() 函数,其他诸如链式操作、各属性对应的函数、添加监听器都与官方 API 完全相同。

4.4.2 NineOldAndroids 中的 ViewHelper

1. 概述

ViewHelper 提供了一系列 set/get 函数去操作 View 的各种属性,比如透明度、偏移量、旋转角度等,大大方便了我们的使用,而且无须考虑低版本的兼容性问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public static float getAlpha(View view)
public static void setAlpha(View view, float alpha)
public static float getPivotX(View view)
public static void setPivotX(View view, float pivotX)
public static float getPivotY(View view)
public static void setPivotY(View view, float pivotY)
public static float getRotation(View view)
public static void setRotation(View view, float rotation)
public static float getRotationX(View view)
public static void setRotationX(View view, float rotationX)
public static float getRotationY(View view)
public static void setRotationY(View view, float rotationY)
public static float getScaleX(View view)
public static void setScaleX(View view, float scaleX)
public static float getScaleY(View view)
public static void setScaleY(View view, float scaleY)
public static float getScrollX(View view)
public static void setScrollX(View view, float scrollX)
public static float getScrollY(View view)
public static void setScrollY(View view, float scrollY)
public static float getTranslationX(View view)
public static void setTranslationX(View view, float translationX)
public static float getTranslationY(View view)
public static void setTranslationY(View view, float translationY)
public static float getX(View view)
public static void setX(View view, float x)
public static float getY(View view)
public static void setY(View view, float y)

2. 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
final TextView tv = (TextView) findViewById(R.id.tv);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
ValueAnimator animator = ValueAnimator.ofFloat(0, 200);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator valueAnimator) {
Float cur = (Float) valueAnimator.getAnimatedValue();
ViewHelper.setTranslationX(tv, cur);
ViewHelper.setTranslationY(tv, cur);
}
});
}
});